textlintで正規表現を使って特定範囲を無視させる方法
どうも。 eetann(えーたん) です。
本記事では半角 [
, ]
を全角 [
, ]
に置き換えて表示している部分があります。
DevelopersIO ではシンタックスハイライトを[shell]code[/shell]
のように書いています。
独自の記法であるため、Markdownのファイルで下書きをしていると文章校正ツール textlint で無視されずに何らかのルールで指摘されてしまうことが多いです(例:文字数制限)。
そこで、本記事では[shell]code[/shell]
の記法を例に、正規表現で特定範囲を無視するtextlintの設定をします。
先にまとめ
textlint-filter-rule-allowlist をインストールし、
textlintの設定ファイルである.textlintrc
に無視する範囲を以下のように書きます。
{ "filters": { "allowlist": { "allow": [ "/^\\[.+\\]$[^]*?^\\[\\/.+\\]$/m" ] } }, "rules": { "preset-ja-technical-writing": true } }
具体例
設定前の状態
今回はルールのプリセットとして textlint-rule-preset-ja-technical-writing を使いました。
以下がtextlintを適用するサンプル(Markdownを想定)です。
サンプルの文章です。 ![hoge](./images/hoge.png) [サンプルのリンク](https://dev.classmethod.jp/author/eetann) です。 [text] シンタックスハイライトの中です [/text] [text title="README.md"] タイトル付きです。 [/text] [text firstline="2,5-7"] 2行目、5から7行目をハイライトします。 ./ |-- hoge.txt `-- foo |-- bar.md |-- dam.txt |-- index.html |-- lalala.ts `-- momo.ts [/text] [サンプルのリンク2](https://dev.classmethod.jp/author/eetann) です。
以下が無視する範囲の設定前の.textlintrc
です。
{ "rules": { "preset-ja-technical-writing": true } }
[text]code[/text]
の範囲を無視する設定をしてないため、以下のように怒られます。
- 文末が"。"で終わっていない
- 100文字を超えている
正規表現で指定する例
上記サンプルの[text]〜[/text]
、[text title="README.md"]〜[/text]
、[text firstline="2,5-7"]〜[/text]
を無視できるようにします。
以下の画像の黄色でハイライトされている3箇所です。
textlint-filter-rule-allowlist をインストールすると、filters
のallowlist
に無視する設定を書くことができます。
以下が今回扱う正規表現^\[.+\]$[^]*?^\[\/.+\]$
をRegexperを使って可視化したものです。
allowlist
のallow
は配列です。
正規表現で指定する場合は通常の文字列と区別するため、/
で挟み必要に応じでフラグを指定します。
{ "filters": { "allowlist": { "allow": [ "/^\\[.+\\]$[^]*?^\\[\\/.+\\]$/m" ] } }, "rules": { "preset-ja-technical-writing": true } }
textlint-filter-rule-allowlistは内部で regexp-string-matcher(さらに to-regex)を使っています。そのため、jsonの文字列ではRegExp
の形式で書きます。
たとえば、[
を文字列として扱いたい場合は\[
ではなく\\[
のようにエスケープします。
regexp-string-matcherでは、フラグg
がデフォルトで付与されています。
今回はシンタックスハイライト内のソースコードを書く部分が複数行に渡る(=改行を含む)ため、フラグm
も使います。
フラグm
を使う場合、改行を含む任意の一文字は.
ではなく[^]
にします。
参考:
一時的ならコメントで挟む
正規表現で設定ファイルに指定するのではなく、一時的に無効にしたい箇所はtextlint-filter-rule-commentsをインストールし、コメントで挟めば可能です。
.textlintrc
のfiltersのcommentsをtrue
にします。
{ "filters": { "comments": true, "allowlist": { "allow": [ "/^\\[.+\\]$[^]*?^\\[\\/.+\\]$/m" ] } }, "rules": { "preset-ja-technical-writing": true } }
以下のようにtextlint-disableとtextlint-enableのコメントアウトと改行で挟みます。
<!-- textlint-disable --> これはとても長い文章の例で、 長くするため適当な文章にしており、 textlintに長いですと注意されますが、 無視したい場合はtextlintの設定ファイル`.textlintrc`にて設定を変えて コメントアウトで挟めば可能です。 <!-- textlint-enable -->
参考:
その他
.textlintrcはYAMLでも書ける
Configuring textlintを眺めていて気がついたのですが、
.textlintrc
はJSONだけではなくYAMLやJavaScriptで書けるようです。
また、拡張子も.textlintrc.yaml
などに変えても読み込めるようです。
以下、YAML形式で書いた例です。 {}
や""
が省けます。
filters: comments: true allowlist: allow: - /^\[.+\]$[^]*?^\[\/.+\]$/m rules: preset-ja-technical-writing: true
テキストエディタのプラグインで .textlintrc
があるディレクトリをルートとしてtextlintを自動で走らせている場合、
拡張子を変えると認識されなくなるため、
別途設定が必要です。注意しましょう。
リンク集
よく開いたページのリンクをまとめておきます。
- Configuring textlint · textlint
- textlint/textlint-filter-rule-allowlist
- 正規表現 - JavaScript | MDN
- Regexper
- JavaScript正規表現テスター - instant tools
書いたコードのGitHubのリンクは以下です。